(杂)MySQL 增加 HTTP/REST 客户端

  最近项目需要前端实现一个实时图表功能。
  最开始的设计是让前端通过 Ajax 轮询的方式去调用接口获取数据库的数据,但考虑到其比较消耗资源,现在改用 WebSocket 技术实现。
  实时图表的核心是相关数据变化就更新,那么后端该如何检测数据的变化呢?
  其中之一的解决方案就是:在 MySQL 中使用触发器。
  在 MySQL 的相关表中创建触发器后,当表中有数据插入、删除、更新时该触发器就去调用 Java 接口,而该接口被调用后就会去通知 WebSocket 的服务端去通知所有连接的客户端(前端)更新数据。
  那么问题来了,要让触发器去调用一个 Java 接口,肯定需要发起 HTTP 请求,可 MySQL 触发器本身并不支持该功能,那么该如何发起 HTTP 请求呢?
  答案是使用 MySQL-UDF-HTTP

什么是 MySQL-UDF-HTTP ?

  MySQL-UDF-HTTP 是一款简单的 MySQL 用户自定义函数(UDF, User-Defined Functions),具有http_get()http_post()http_put()http_delete()四个函数,可以在 MySQL 数据库中利用 HTTP 协议进行 REST 相关操作。

MySQL-UDF-HTTP 的安装

  在 Linux 系统上安装 MySQL-UDF-HTTP 需要先下载 curl 和 mysql-udf-http-1.0 的压缩包,下载完成后执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装 curl
tar zxvf curl-7.67.0.tar.gz
cd curl-7.67.0/
./configure --prefix=/usr/local/curl
make && make install
cd ../

# 安装 mysql-udf-http
tar zxvf mysql-udf-http-1.0.tar.gz
cd mysql-udf-http-1.0/
./configure --prefix=/usr/local/mysql-udf-http --with-mysql=/usr/local/mysql/bin/mysql_config
make && make install
cd ../

注意哦--with-mysql后面的/usr/local/mysql/bin/为 MySQL 的安装路径(通过 RPM 方式 安装的请更改为 /usr/bin),其中mysql_config文件也有可能为mysql_config-64(取决于你的环境),若没有该文件,应该是通过 RPM 安装的 MySQL 没有下载安装 mysql-community-devel-xxx.rpm,安装完成后可在/usr/bin下找到。

  若安装过程出现 No package 'libcurl' found错误,请执行以下命令安装libcurl

1
yum install libcurl-devel

  前面的命令都成功后,执行下面的命令:

1
cp /usr/local/mysql-udf-http/lib/mysql/plugin/mysql-udf-http.so.0.0.0 /usr/lib64/mysql/plugin/mysql-udf-http.so

  其中/usr/lib64/mysql/plugin/为你 MySQL 的插件位置,可能略有不同哦!

MySQL-UDF-HTTP 的使用

  前面的安装都正确时,登录 MySQL 执行以下命令:

1
2
3
4
CREATE FUNCTION http_get RETURNS string SONAME 'mysql-udf-http.so';  
CREATE FUNCTION http_post RETURNS string SONAME 'mysql-udf-http.so';
CREATE FUNCTION http_put RETURNS string SONAME 'mysql-udf-http.so';
CREATE FUNCTION http_delete RETURNS string SONAME 'mysql-udf-http.so';

  执行成功后,测试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT http_get('dreamskying.cn'); 
+------------------------------------------------+
| http_get('dreamskying.cn') |
+------------------------------------------------+
| <html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>
|
+------------------------------------------------+
1 row in set (0.01 sec)

参考

0%